--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_outbound_http_allowlist.py
Displaying Raw • Download
tests/backend/test_outbound_http_allowlist.py HEAD (2bf00cb3) Text, 2.34 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""New backend clearnet fetches must be listed here and gated by privacy mode.
Do not add a file to KNOWN_CLEARNET_FETCH_FILES until it calls
ensure_outbound_http_allowed, http_url_guard, or _require_outbound_http
(or is the RNS HTTPInterface, which is mesh transport, not app clearnet).
"""
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path
Te6edf3BACKEND_ROOT Tff7b72= Te6edf3PathTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx/src/backendTa5d6ff"Tb4b4b4)
Te6edf3FETCH_MARKERS Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffaiohttp.ClientSessionTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffhttpx.Client(Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffhttpx.AsyncClient(Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffurllib.request.urlopenTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffurllib.request.Request(Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3KNOWN_CLEARNET_FETCH_FILES Tff7b72= Tffa657frozensetTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffdata/interfaces/HTTPInterface.pyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_manager.pyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrepository_server_manager.pyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftranslator_handler.pyTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3MESH_TRANSPORT_FETCH_FILES Tff7b72= Tffa657frozensetTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffdata/interfaces/HTTPInterface.pyTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3PRIVACY_GATE_MARKERS Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffensure_outbound_http_allowedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffhttp_url_guardTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff_require_outbound_httpTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffOutboundHttpBlockedErrorTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ff_relTb4b4b4(Te6edf3pathTb4b4b4: Te6edf3PathTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Te6edf3pathTff7b72.Td2a8ffrelative_toTb4b4b4(Te6edf3BACKEND_ROOTTb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_new_backend_clearnet_fetches_are_allowlistedTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3foundTb4b4b4: Tffa657setTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3path Tff7b72in Te6edf3BACKEND_ROOTTff7b72.Td2a8ffrglobTb4b4b4(Ta5d6ff"Ta5d6ff*.pyTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3text Tff7b72= Te6edf3pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72if Tffa657anyTb4b4b4(Te6edf3marker Tff7b72in Te6edf3text Tff7b72for Te6edf3marker Tff7b72in Te6edf3FETCH_MARKERSTb4b4b4)Tb4b4b4:
Te6edf3foundTff7b72.Td2a8ffaddTb4b4b4(Te6edf3_relTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3found Tff7b72== Tffa657setTb4b4b4(Te6edf3KNOWN_CLEARNET_FETCH_FILESTb4b4b4)Tb4b4b4, Tb4b4b4(
Ta5d6ff"Ta5d6ffNew backend httpx/urllib/aiohttp client usage must call Ta5d6ff"
Ta5d6ff"Ta5d6ffensure_outbound_http_allowed or http_url_guard, then be added to Ta5d6ff"
Ta5d6ff"Ta5d6ffKNOWN_CLEARNET_FETCH_FILES. Extra: Ta5d6ff"
Ta5d6fffTa5d6ff"Tffd700{Tffa657sortedTb4b4b4(Te6edf3found Tff7b72- Te6edf3KNOWN_CLEARNET_FETCH_FILESTb4b4b4)Tffd700}Ta5d6ff. Missing from disk: Ta5d6ff"
Ta5d6fffTa5d6ff"Tffd700{Tffa657sortedTb4b4b4(Te6edf3KNOWN_CLEARNET_FETCH_FILES Tff7b72- Te6edf3foundTb4b4b4)Tffd700}Ta5d6ff"
Tb4b4b4)
Tff7b72def Td2a8fftest_allowlisted_app_fetches_mention_a_privacy_gateTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3rel Tff7b72in Tffa657sortedTb4b4b4(Te6edf3KNOWN_CLEARNET_FETCH_FILES Tff7b72- Te6edf3MESH_TRANSPORT_FETCH_FILESTb4b4b4)Tb4b4b4:
Te6edf3text Tff7b72= Tb4b4b4(Te6edf3BACKEND_ROOT Tff7b72/ Te6edf3relTb4b4b4)Tff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72if Tffa657anyTb4b4b4(Te6edf3marker Tff7b72in Te6edf3text Tff7b72for Te6edf3marker Tff7b72in Te6edf3PRIVACY_GATE_MARKERSTb4b4b4)Tb4b4b4:
Tff7b72continue
T8b949e# Route-gated helpers: the HTTP route must still call the gate.
Tff7b72assert Te6edf3rel Tff7b72in Tb4b4b4{
Ta5d6ff"Ta5d6ffmap_manager.pyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrepository_server_manager.pyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftranslator_handler.pyTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Te6edf3relTffd700}Ta5d6ff opens a clearnet socket without a privacy-mode or URL guardTa5d6ff"
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────